home *** CD-ROM | disk | FTP | other *** search
Text File | 1999-10-25 | 40.3 KB | 1,580 lines |
- #! /bin/sh
- # 1 2 3... \
- exec @@JETHOME@@/bin/jetsync.exe $0 ${1+$@} -geometry +179+225
-
- set JETHOME @@JETHOME@@
- set USER ""
- set SPLASH_SCREEN 1
- set IMAGEDIR $JETHOME/images
- set anim_x 90
- set anim_tag 0
- set anim_dir 20
- set daemon_flag -1
- set child_pid -1
-
- set USER [whoami $JETHOME]
-
- if {[string compare $USER "NULL"]} {
- if { ![file exists $JETHOME/$USER/conf/color.def]} {
- puts "User $USER does not exist! This means an installation error has"
- puts "ocurred.\n"
- puts "Please replace the username in the file \"$JETHOME/conf/prefs\"."
- exit
- }
-
- source $JETHOME/$USER/conf/color.def
- wm title . "JetSync - $USER"
- } else {
- source $JETHOME/default/color.def
- wm title . "JetSync"
- }
-
-
- # recalculates the colors for all widgets in app
- proc calc_Palette {} {
- global FORE BACK
-
- tk_setPalette \
- foreground $FORE background $BACK \
- activeforeground $FORE activebackground $BACK
- }
-
- ### Splash screen ###
- # updates the content of the splash screen
- proc update_splash { name } {
- global SPLASH_SCREEN
-
- if { !$SPLASH_SCREEN } return
-
- if [ string compare $name "" ] {
- .sbottom.l1 configure -text "$name..."
- } else {
- .sbottom.l1 configure -text ""
- }
- update
- after 300
- }
-
-
- # given a toplevel window name and its width, center the window
- # on the screen. If winH and winW are not specified as -1 the window
- # will also be resized to those values
- proc center_window { name winW winH } {
- set h [winfo screenheight .]
- set w [winfo screenwidth .]
-
- if {$winW == -1 } {
- update
- set winW [winfo width $name]
- }
- if {$winH == -1 } {
- update
- set winH [winfo height $name]
- }
- set y [expr ($h - $winH) / 2]
- set x [expr ($w - $winW) / 2]
- wm geometry $name ${winW}x${winH}+${x}+${y}
- }
-
-
- if { $SPLASH_SCREEN } {
- center_window . 256 383
- frame .stop
- frame .sbottom
- frame .sbottom2
-
- image create photo splash -file [file join $IMAGEDIR palm.gif]
- label .stop.l1 -image splash
-
- label .sbottom.l1 -text "Starting up..." -anchor c
-
- label .sbottom2.l1 -text "Miguel Frias"
- label .sbottom2.l2 -text "Joaquim Agostinho"
- pack .stop -side top -fill x
- pack .sbottom -pady 10 -anchor c
- pack .sbottom2 -side top -fill x -pady 20
- pack .stop.l1
- pack .sbottom.l1
- pack .sbottom2.l1 .sbottom2.l2 -side top
-
- update_splash "Starting up"
- }
-
-
- calc_Palette
- update_splash "Initializing JetSync"
-
- ### Generic settings ###
- set show_d_path ""
- set show_d_status ""
- set modem_dev_port "/dev/cua0"
- set modem_dev_speed "9600"
- set modem_dev_type ""
- set modem_dev_str ""
- set local_dev_port "/dev/cua0"
- set local_dev_speed "9600"
- set env(PILOTPORT) /dev/cua0
- set env(PILOT_PORT) /dev/cua0
- set env(PILOTRATE) 19200
- set env(PILOT_RATE) 19200
- set env(PILOTHIGHRATE) 19200
- set hotsync_opt 0
- set chpass_old ""
- set chpass_new ""
- set new_user ""
- set new_pass ""
- set CONDUIT_FILE conduits.def
- set JETUSERS_FILE jetusers
- set hsa_conduits ""
- set seed [expr [clock seconds] % 10]
-
-
- # show the get-file tcl/tk dialog and return the seleceted filename
- proc tk_get_file {} {
- return [tk_getOpenFile -title "File to upload to Pilot" \
- -filetypes {{{Pilot Resource Code} {.prc}}}]
- }
-
-
-
- # load modem and local device data (port and speed mainly)
- proc load_devices {} {
- global JETHOME local_dev_port local_dev_speed
- global modem_dev_type modem_dev_str modem_dev_port modem_dev_speed
- global daemon_flag child_pid
-
- set fp [open $JETHOME/conf/prefs r]
-
- # ignore first two lines (PCID, USER)
- gets $fp line
- gets $fp line
-
- # read values
- gets $fp line
- set modem_dev_port [lindex [split $line ":"] 1]
- gets $fp line
- set modem_dev_speed [lindex [split $line ":"] 1]
- gets $fp line
- set modem_dev_type [lindex [split $line ":"] 1]
- gets $fp line
- set modem_dev_str [lindex [split $line ":"] 1]
- gets $fp line
- set local_dev_port [lindex [split $line ":"] 1]
- gets $fp line
- set local_dev_speed [lindex [split $line ":"] 1]
- gets $fp line
- set daemon_flag [lindex [split $line ":"] 1]
- set child_pid [lindex [split $line ":"] 2]
- close $fp
-
- set env(PILOTPORT) $local_dev_port
- set env(PILOT_PORT) $local_dev_port
- set env(PILOTRATE) $local_dev_speed
- set env(PILOT_RATE) $local_dev_speed
- set env(PILOTHIGHRATE) $local_dev_speed
- }
-
-
- # save modem and local device configuration
- proc save_devices {} {
- global JETHOME local_dev_port local_dev_speed
- global modem_dev_type modem_dev_str modem_dev_port modem_dev_speed
- global daemon_flag child_pid
-
- set fname $JETHOME/conf/prefs
- set fp [open $fname r]
- set fpw [open $fname.tmp w]
-
- # ignore first two lines (PCID, USER)
- gets $fp line
- puts $fpw $line
- gets $fp line
- puts $fpw $line
-
- # write values
- puts $fpw "MODEM:$modem_dev_port"
- puts $fpw "MODEMSPEED:$modem_dev_speed"
- puts $fpw "MODEMTYPE:$modem_dev_type"
- puts $fpw "MODEMSTR:$modem_dev_str"
- puts $fpw "LOCAL:$local_dev_port"
- puts $fpw "LOCALSPEED:$local_dev_speed"
- puts $fpw "DAEMON:$daemon_flag:$child_pid"
-
- close $fp
- close $fpw
- file rename -force $fname.tmp $fname
-
- set env(PILOTPORT) $local_dev_port
- set env(PILOT_PORT) $local_dev_port
- set env(PILOTRATE) $local_dev_speed
- set env(PILOT_RATE) $local_dev_speed
- set env(PILOTHIGHRATE) $local_dev_speed
- }
-
-
- # sub-procedure of installConduit. Given a conduit name, installs
- # it onto the current user's conduit definition file
- proc insertConduit { name } {
- global JETHOME USER
-
- set CONDUITFILE "$JETHOME/$USER/conf/conduits.def"
- set fp [open $CONDUITFILE r]
- set ok 1
- while {[gets $fp line] >= 0 } {
- if { ![string compare [lindex [split $line ":"] 0] $name]} {
- # entry was found, conduit is alrady installed
- set ok 0
- }
- }
- close $fp
-
- if { $ok } {
- set fp [open $JETHOME/conf/conduits.lst r]
- while {[gets $fp line] >= 0 } {
- if { ![string compare $name [lindex [split $line ":"] 0]]} {
- break
- }
- }
- close $fp
-
- set fp [open $CONDUITFILE a]
- puts $fp "$line"
- close $fp
- read_defaults
- tk_messageBox -type ok -title "Success"\
- -message "Conduit $name has been successfully installed for user \"$USER\"."
- } else {
- tk_messageBox -icon error -type ok -title "Error"\
- -message "Conduit $name is already installed for user \"$USER\"."
- }
- }
-
-
- # master-procedure of insertConduit. Asks for a conduit name
- # to be installed
- proc installConduit {} {
- global JETHOME USER
-
- set fp [open $JETHOME/conf/conduits.lst r]
- set i 0
- while {[gets $fp line] >= 0 } {
- incr i
- set avail_conduits($i) "$line"
- }
- close $fp
-
- catch {destroy .ins}
- toplevel .ins
- wm resizable .ins 0 0
- wm title .ins "Install conduit..."
-
- frame .ins.top
- frame .ins.bottom
- frame .ins.but
- pack .ins.top -pady 20
- pack .ins.bottom -ipadx 20 -pady 20 -anchor c
- pack .ins.but -anchor c -pady 20
-
- label .ins.top.l \
- -text "$USER\n\nPlease select a conduit from the list below:"
- pack .ins.top.l -anchor w
-
- listbox .ins.bottom.l -width 30
- .ins.bottom.l configure -font *-times-*-r-*--*-140-*-*-*-*-*-*
- for {set j 1} {$j <= $i} {incr j} {
- foreach item [lindex [split $avail_conduits($j) ":"] 0] {
- .ins.bottom.l insert end $item
- }
- }
- bind .ins.bottom.l <Double-Button-1> {
- catch {insertConduit [selection get -displayof .ins.bottom.l]}
- }
-
- pack .ins.bottom.l -anchor c
-
- defbutton .ins.but.ins -text "Install" -command {
- catch {insertConduit [selection get -displayof .ins.bottom.l]}
- }
-
- cancelbutton .ins.but.clo -text "Close" -command "destroy .ins"
- pack .ins.but.ins .ins.but.clo -side left -padx 20 -anchor c
- }
-
-
- # sub-procedure of removeConduit. Given a conduit name, removes
- # it from the current user's conduit definition file
- proc deleteConduit { name } {
- global JETHOME USER
-
- set CONDUITFILE "$JETHOME/$USER/conf/conduits.def"
- set fp [open $CONDUITFILE r]
- set fpw [open $CONDUITFILE.tmp w]
- set i 0
- set j 0
- while {[gets $fp line] >= 0 } {
- if { [string compare [lindex [split $line ":"] 0] $name]} {
- puts $fpw $line
- } else {
- set i $j
- }
- incr j
- }
- close $fp
- close $fpw
- file rename -force $CONDUITFILE.tmp $CONDUITFILE
-
- read_defaults
- .ins.bottom.l delete $i
- }
-
-
- # master-procedure of deleteConduit. Asks for a conduit name
- # to be removed
- proc removeConduit {} {
- global JETHOME USER
-
- set CONDUITFILE "$JETHOME/$USER/conf/conduits.def"
- set fp [open $CONDUITFILE r]
- set i 0
- while {[gets $fp line] >= 0 } {
- incr i
- set avail_conduits($i) "$line"
- }
- close $fp
-
- catch {destroy .ins}
- toplevel .ins
- wm resizable .ins 0 0
- wm title .ins "Remove conduit..."
-
- frame .ins.top
- frame .ins.bottom
- frame .ins.but
- pack .ins.top -pady 20
- pack .ins.bottom -ipadx 20 -pady 20 -anchor c
- pack .ins.but -anchor c -pady 20
-
- label .ins.top.l \
- -text "$USER\n\nPlease select a conduit from the list below:"
- pack .ins.top.l -anchor w
-
- listbox .ins.bottom.l -width 30
- .ins.bottom.l configure -font *-times-*-r-*--*-140-*-*-*-*-*-*
- for {set j 1} {$j <= $i} {incr j} {
- foreach item [lindex [split $avail_conduits($j) ":"] 0] {
- .ins.bottom.l insert end $item
- }
- }
- bind .ins.bottom.l <Double-Button-1> {
- catch {deleteConduit [selection get -displayof .ins.bottom.l]}
- }
-
- pack .ins.bottom.l -anchor c
-
- defbutton .ins.but.ins -text "Remove" -command {
- catch {deleteConduit [selection get -displayof .ins.bottom.l]}
- }
-
- cancelbutton .ins.but.clo -text "Close" -command "destroy .ins"
- pack .ins.but.ins .ins.but.clo -side left -padx 20 -anchor c
- }
-
-
-
- # generates a random number in the range 1..max
- proc random { max } {
- global seed
-
- incr seed
- set secs [clock seconds]
- set i [expr [expr $secs * $seed] % $max + 1]
- if { ![regexp {0[8-9]} $secs] } {
- set seed [expr $secs % 10]
- } else {
- set seed [expr [clock format [clock seconds] -format %S]]
- }
- return $i
- }
-
-
- # sub-procedure of delUser. Given a user name, removes
- # it from the jetsync user file
- proc removeUser { name } {
- global JETHOME USER
-
- catch {destroy .delete}
- toplevel .delete
- set var [tk_dialog .delete {Confirm} \
- "This option removes all of the user's data.\
- \n\nAre you sure you wish to remove user $name?" \
- {} 1 Yes No]
- destroy .delete
-
- # handle No button (cancel erase)
- if { $var == 1 } return
-
- file delete -force $JETHOME/$name
-
- set fname $JETHOME/conf/jetusers
- set fp [open $fname r]
- set fpw [open $fname.tmp w]
- set i 0
- while {[gets $fp line] >= 0 } {
- if {[string compare [lindex [split $line ":"] 0] $name]} {
- puts $fpw $line
- } else {
- .ins.bottom.l delete $i
- }
- if {[string compare [lindex [split $line ":"] 0] $USER]} {
- incr i
- }
- }
- close $fp
- close $fpw
- file rename -force $fname.tmp $fname
- }
-
-
- # master-procedure of removeUser. Asks for a user name
- # to be removed from the jetsync user file
- proc delUser {} {
- global JETHOME USER
-
- catch {destroy .ins}
- toplevel .ins
- wm resizable .ins 0 0
- wm title .ins "Remove user..."
-
- frame .ins.top
- frame .ins.bottom
- frame .ins.but
- pack .ins.top -pady 20 -anchor w -padx 20
- pack .ins.bottom -ipadx 20 -pady 20 -anchor c
- pack .ins.but -anchor c -pady 20
-
- label .ins.top.l \
- -text "Please select the user name to be removed from the list below:" \
- -wraplength 300 -justify left
- pack .ins.top.l -anchor w
-
- listbox .ins.bottom.l -width 30
- .ins.bottom.l configure -font *-times-*-r-*--*-140-*-*-*-*-*-*
-
- pack .ins.bottom.l -anchor c
-
- bind .ins.bottom.l <Double-Button-1> {
- catch {removeUser [selection get -displayof .ins.bottom.l]}
- }
- defbutton .ins.but.ins -text "Remove" -command {
- catch {removeUser [selection get -displayof .ins.bottom.l]}
- }
-
- cancelbutton .ins.but.clo -text "Close" -command "destroy .ins"
- pack .ins.but.ins .ins.but.clo -side left -padx 20 -anchor c
-
- set fp [open $JETHOME/conf/jetusers r]
- while {[gets $fp line] >= 0 } {
- if { [string compare $USER [lindex [split $line ":"] 0]] } {
- .ins.bottom.l insert end [lindex [split $line ":"] 0]
- }
- }
- close $fp
- }
-
-
- # asks for a username to be added to the jetsync user file
- proc addUser {} {
- global JETHOME USER
-
- set data [show_info_dialog "NULL"]
-
- if { ![string compare $data "" ]} {
- wm title . "JetSync - $USER"
- return
- }
-
- set USERNAME [lindex [split $data ":"] 0]
- set PASSWORD [lindex [split $data ":"] 1]
-
- set fp [open $JETHOME/conf/jetusers a]
- puts $fp "$USERNAME:$PASSWORD:[random 999999999]"
- close $fp
- file attributes $JETHOME/conf/jetusers -permissions 0755
-
- file mkdir $JETHOME/$USERNAME
- file mkdir $JETHOME/$USERNAME/conf
- exec install -m 0755 $JETHOME/default/color.def \
- $JETHOME/$USERNAME/conf/color.def
- exec install -m 0755 $JETHOME/default/conduits.def \
- $JETHOME/$USERNAME/conf/conduits.def
-
- foreach i {memos addrs todos i.cal} {
- exec install -m 0755 $JETHOME/default/$i $JETHOME/$USERNAME/$i
- }
-
- set fp [open $JETHOME/$USERNAME/conf/prefs w]
- puts $fp "MODNUM:0"
- close $fp
-
- foreach {i} {jetmemo jetaddr jettodo jetdate} {
- set fp [open $JETHOME/$USERNAME/conf/$i.dat w]
- puts $fp "$JETHOME/$USERNAME"
- close $fp
- file copy -force setup.dir/default/$i.cat \
- $JETHOME/$USERNAME/conf/$i.cat
- }
- set fp [open $JETHOME/$USERNAME/conf/jetmail.dat w]
- close $fp
- set fp [open $JETHOME/$USERNAME/conf/ical.map w]
- close $fp
-
- set fp [open $JETHOME/$USERNAME/hotsync.log w]
- close $fp
-
- changeUser $USERNAME 0
- }
-
-
- # erases a user's log
- proc eraseLog {} {
- global JETHOME USER
-
- catch {destroy .delete}
- toplevel .delete
- set var [tk_dialog .delete {Confirm} "Really erase your log?" {} 1 Yes No]
- destroy .delete
-
- # handle No button (cancel erase)
- if { $var == 1 } return
-
- # zeroe logfile
- set fp [open $JETHOME/$USER/hotsync.log w]
- close $fp
- .log.t.text configure -state normal
- .log.t.text delete 1.0 end
- .log.t.text configure -state disabled
- }
-
-
- # brings up a window showing the hotsync log for the current user
- proc viewLog {} {
- global JETHOME USER
-
- catch {destroy .log}
- toplevel .log
- wm resizable .log 0 0
- wm title .log "View log"
-
- frame .log.t
- frame .log.b
- pack .log.t .log.b -pady 10
-
-
- text .log.t.text -yscrollcommand ".log.t.scroll set"
-
- set fp [open $JETHOME/$USER/hotsync.log r]
- while {[gets $fp line] >= 0 } {
- .log.t.text insert end $line
- .log.t.text insert end "\n"
- }
- close $fp
- .log.t.text yview moveto 1.0
-
- scrollbar .log.t.scroll -command ".log.t.text yview"
- pack .log.t.text .log.t.scroll -side left -expand 1 -fill y
-
- cancelbutton .log.b.close -text "Close" -command "destroy .log"
- button .log.b.erase -text "Erase log" -command "eraseLog"
- setupcolor .log.b.close 1
- setupcolor .log.b.erase 1
- .log.t.text configure -state disabled
- pack .log.b.close .log.b.erase -side left -padx 20
- }
-
-
-
- # changes the current user to a given user name
- # Note: flag indicates this proc being called from within the HotSync
- # setup window (so as to update some of its widgets)
- proc changeUser { name flag } {
- global USER hsa_conduits JETHOME BACK FORE
-
- if {[string compare $USER "NULL"]} {
- wm title . "JetSync - $name"
- } else {
- wm title . "JetSync"
- }
-
- set USER $name
-
- tcl_change_user $USER
- read_defaults
-
- if {![string compare $USER "NULL"]} {
- source $JETHOME/$USER/conf/color.def
- setColor_helper . "-background" $BACK
- setColor_helper . "-foreground" $FORE
- setColor_helper . "-activeforeground" $FORE
- setColor_helper . "-activebackground" $BACK
- }
-
- if { !$flag } return
-
- .setup.left.list delete 0 end
- foreach item $hsa_conduits {.setup.left.list insert end $item}
-
-
- if {[string compare $USER "NULL"]} {
- .setup.up.list configure -text "$USER"
- } else {
- .setup.up.list configure -text ""
- }
- }
-
-
- # calls the C code that manages all of the synchronization
- # Note: the C function returns the name of the current user which will
- # differ if pilot name and desktop user name differ
- proc doHotSyncManager {} {
- set result [HOTSYNCMANAGER]
- if { $result == -1 } {
- tk_messageBox -icon error -type ok -title "Error"\
- -message "Could not establish connection between pilot and desktop."
- } else {
- changeUser $result 0
- }
- }
-
-
- # shows up a dialog asking for a new user name and password
- # Note: used both via C and via tcl/tk
- proc show_info_dialog { user } {
- global show_d_path show_d_status new_user new_pass
-
- toplevel .info
- wm title .info "New user..."
- wm geometry .info +329+374
-
- frame .info.f1
- frame .info.f2
- genericbgcolor .info
- genericbgcolor .info.f1
- genericbgcolor .info.f2
-
- label .info.f1.l -text "Username: "
- setupcolor .info.f1.l 0
- if { ![string compare $user "NULL"] } {
- set new_user ""
- entry .info.f1.e -textvariable new_user
- } else {
- set new_user $user
- label .info.f1.e -text "$user" -anchor w
- }
- setupcolor .info.f1.e 0
-
- pack .info.f1 -pady 10 -padx 10 -fill x
- pack .info.f1.l .info.f1.e -anchor w -side left
-
- label .info.f2.l -text "Password: "
- setupcolor .info.f2.l 0
- set new_pass ""
- entry .info.f2.e -textvariable new_pass -show "*"
-
- pack .info.f2 -pady 10 -padx 10 -fill x
- pack .info.f2.l .info.f2.e -anchor w -side left
-
- set show_d_status 0
- defbutton .info.ok -text "Ok" -command {set show_d_status 1}
- genericbgcolor .info.ok
- cancelbutton .info.cnc -text "Cancel" -command {destroy .info; return ""}
- pack .info.ok .info.cnc -pady 10 -padx 10 -side left
- update
-
- tkwait var show_d_status
- destroy .info
- update
-
- if { $show_d_status == 2 } {
- return ""
- } else {
- wm title . "JetSync - $new_user"
- return "$new_user:$new_pass"
- }
- }
-
-
- proc check_hex { j } {
- if { $j == 10 } { return "A" }
- if { $j == 11 } { return "B" }
- if { $j == 12 } { return "C" }
- if { $j == 13 } { return "D" }
- if { $j == 14 } { return "E" }
- if { $j == 15 } { return "F" }
- return $j
- }
-
- # calculates the appropriate color for the progress bar in the
- # synchronization window
- # Note: the color is calculated using Gouraud's coloring algorithm
- # 'type' indicates which of the progress bars (they have different
- # colors)
- # 'val' indicated the percentage of Gouraud coloring to use
- proc calc_color { type val } {
- if { $type == 1 } {
- set calc_red [expr (255 * $val) / 200]
- set calc_green 0
- set calc_blue [expr 255 - (255 * $val) / 200]
- }
- if { $type == 2 } {
- set calc_red [expr (255 * $val) / 200]
- set calc_green [expr 127 + (255 * $val) / 400]
- set calc_blue 0
- }
-
- set i1 [expr $calc_red / 16]
- set i2 [expr $calc_red % 16]
- set j1 [expr $calc_green / 16]
- set j2 [expr $calc_green % 16]
- set k1 [expr $calc_blue / 16]
- set k2 [expr $calc_blue % 16]
-
- set j1 [check_hex $j1]
- set j2 [check_hex $j2]
- set k1 [check_hex $k1]
- set k2 [check_hex $k2]
- set i1 [check_hex $i1]
- set i2 [check_hex $i2]
-
- return "#${i1}${i2}${j1}${j2}${k1}${k2}"
- }
-
-
- # ensures that the progress dialog is closed
- proc killprogress {} {
- after 1000 destroy .prog
- }
-
-
- # shows/updates the progress bar window (when synchronizing)
- proc progress { value value2 text } {
- global BACK FORE anim_x anim_dir anim_tag IMAGEDIR
-
- # progress must be called first time with at least value = -1 so that the
- # window is created and brought up
- if {$value == -1} {
- destroy .prog
- toplevel .prog
- wm title .prog "Synchronization..."
- center_window .prog 300 280
- set value 0
-
- genericbgcolor .prog
- label .prog.l -text "$text..."
- genericbgcolor .prog.l
- pack .prog.l -pady 30
-
- canvas .prog.c -relief flat -width 300 -height 220 -bd 1
-
- genericbgcolor .prog.c
- pack .prog.c
-
- # create two 'new' progress bars
- .prog.c create rect 25 10 225 20 -fill white
- .prog.c create rect 25 70 225 80 -fill white
-
- # animation specs
- image create photo l0 -file [file join $IMAGEDIR synch0.gif]
- image create photo l1 -file [file join $IMAGEDIR synch2.gif]
- image create photo l2 -file [file join $IMAGEDIR synch1.gif]
- image create photo l2a -file [file join $IMAGEDIR synch1a.gif]
- label .prog.c.l0 -image l0
- label .prog.c.l1 -image l1
- label .prog.c.l2 -image l2
- .prog.c create window 60 150 -window .prog.c.l1
- .prog.c create window 220 150 -window .prog.c.l2
- set anim_dir 20
-
- update
- }
-
- if { $value != -2 } {
- set pos [expr 25 + $value]
- .prog.l configure -text $text
-
- # 1st bar
- .prog.c create rect 25 10 $pos 20 -fill [calc_color 1 $value]
-
- .prog.c create rect 235 5 275 25 -fill white
- .prog.c create text 255 15 -text "[expr $value / 2]%"
- }
-
- # 2nd bar
- if {$value2 == 0} {
- .prog.c create rectangle 25 70 [expr 25 + 100 * 2] 80 -fill white
- }
- .prog.c create rectangle 25 70 [expr 25 + $value2] 80 -fill [calc_color 2 $value2]
-
- .prog.c create rect 235 65 275 85 -fill white
- .prog.c create text 255 75 -text "[expr $value2 / 2]%"
-
-
- # penguin blink
- if { $anim_x >= 120 && $anim_x <= 130 } {
- .prog.c.l2 configure -image l2a
- } else {
- .prog.c.l2 configure -image l2
- }
-
- # document icon direction
- if { $anim_x <= 70 } {
- set anim_dir 20
- }
- if { $anim_x >= 194 } {
- set anim_dir -20
- }
- incr anim_x $anim_dir
-
-
- # redraw document icon
- if { $anim_tag } {
- .prog.c delete $anim_tag
- }
- set tag [.prog.c create window $anim_x 150 -window .prog.c.l0]
-
- update
-
- # auto-kill of progress dialog when task is complete
- if {$value >= 200} {
- .prog.c create rect 25 10 225 20 -fill black
- exec sleep 1
- destroy .prog
- return
- }
- }
-
-
- # saves the changes of the coloring
- proc save_colors {} {
- global JETHOME BACK FORE USER
-
- # change color for main window
- genericbgcolor .mbar
- genericbgcolor .bot.f1
- genericbgcolor .bot.f2
- genericbgcolor .status
- setupcolor .status.l 0
- setupcolor .b1 1
- setupcolor .b2 1
- setupcolor .b3 1
- setupcolor .b4 1
- setupcolor .b5 1
- setupcolor .b6 1
- setupcolor .mbar.setup 1
- setupcolor .mbar.config 1
- setupcolor .mbar.tools 1
-
- setupcolor .mbar.setup.menu 1
- setupcolor .mbar.config.menu 1
- setupcolor .mbar.tools.menu 1
-
-
- # save to color def file
- set fp [open $JETHOME/$USER/conf/color.def w]
-
- puts $fp "set BACK $BACK"
- puts $fp "set FORE $FORE"
- puts $fp ""
- puts $fp "proc genericbgcolor { w } {"
- puts $fp "global BACK FORE"
- puts $fp "\$w configure -bg \$BACK"
- puts $fp "\$w configure -bd 1"
- puts $fp "}"
- puts $fp ""
- puts $fp "proc setupcolor { w active } {"
- puts $fp "global BACK FORE"
- puts $fp "\$w configure -bg \$BACK -fg \$FORE"
- puts $fp "if { \$active } {"
- puts $fp " \$w configure -activebackground \$BACK -activeforeground \$FORE"
- puts $fp "}"
- puts $fp ""
- puts $fp "\$w configure -font *-times-*-r-*--*-140-*-*-*-*-*-*"
- puts $fp "\$w configure -bd 1"
- puts $fp "}"
-
- close $fp
- }
-
-
- # sub-procedure of config_password
- proc chpass.ok {} {
- global chpass_old chpass_new USER JETHOME
-
- set fname $JETHOME/conf/jetusers
- set fp [open $fname r]
- set fpw [open $fname.tmp w]
- while {[gets $fp line] >= 0 } {
- set t_user [lindex [split $line ":"] 0]
- if {[string compare $t_user $USER]} {
- puts $fpw $line
- } else {
- set t_pass [lindex [split $line ":"] 1]
- if {![string compare $t_pass $chpass_old]} {
- set t_uid [lindex [split $line ":"] 2]
- puts $fpw "$t_user:$chpass_new:$t_uid"
- } else {
- tk_messageBox -type ok -icon error -title "Password failed"\
- -message "Incorrect password."
- puts $fpw $line
- }
- }
- }
- close $fp
- close $fpw
-
- file rename -force $fname.tmp $fname
-
- set chpass_old ""
- set chpass_new ""
- destroy .chpass
- }
-
-
- # configures the password for private records, for this user
- proc config_password {} {
- set w .chpass
- catch {destroy $w}
- toplevel $w
- wm title $w "Set password for private records"
- wm iconname $w "Password"
- wm geometry $w +337+201
-
- frame $w.f1
- frame $w.f2
- frame $w.f3
- pack $w.f1 $w.f2 -pady 15
- pack $w.f3 -pady 10
- genericbgcolor $w
- genericbgcolor $w.f1
- genericbgcolor $w.f2
- genericbgcolor $w.f3
-
- label $w.f1.l -text "Old password: "
- setupcolor $w.f1.l 0
- entry $w.f1.e -textvariable chpass_old -show "*"
- genericbgcolor $w.f1.e
-
- label $w.f2.l -text "New password: "
- setupcolor $w.f2.l 0
- entry $w.f2.e -textvariable chpass_new -show "*"
- genericbgcolor $w.f2.e
-
- pack $w.f1.l $w.f1.e -side left
- pack $w.f2.l $w.f2.e -side left
-
- defbutton $w.f3.ok -text "Ok" -command "chpass.ok"
- cancelbutton $w.f3.cancel -text "Cancel" -command "destroy .chpass"
- setupcolor $w.f3.ok 1
- setupcolor $w.f3.cancel 1
- pack $w.f3.ok $w.f3.cancel -side left -padx 10
- }
-
-
- # brings up a color picker dialog where user can choose the colors
- # to be used in the program
- proc config_js_colors {} {
- global FORE BACK
-
- set w .clrpick
- catch {destroy $w}
- toplevel $w
- wm title $w "Color Selection Dialog"
- wm iconname $w "colors"
- wm geometry $w +337+201
-
- frame $w.buttons
- pack $w.buttons -side bottom -fill x -pady 2m
- cancelbutton $w.buttons.dismiss -text Close \
- -command "save_colors; calc_Palette; destroy $w"
-
- pack $w.buttons.dismiss -side left -expand 1
-
- button $w.back -text "Set background color ..." \
- -command \
- "setColor $w $w.back background {-background -highlightbackground}"
- button $w.fore -text "Set foreground color ..." \
- -command \
- "setColor $w $w.back foreground -foreground"
- button $w.default -text "Set default colors" -command {
- set BACK Bisque3; set FORE Tan4
- setColor_helper . "-background" $BACK
- setColor_helper . "-foreground" $FORE }
- setupcolor $w.default 1
- setupcolor $w.back 1
- setupcolor $w.fore 1
- setupcolor $w.buttons.dismiss 1
-
- setColor_helper $w "-background" $BACK
- setColor_helper $w "-foreground" $FORE
- setColor_helper $w.buttons "-background" $BACK
- setColor_helper $w.buttons "-foreground" $FORE
- setColor_helper $w.back "-background" $BACK
- setColor_helper $w.back "-foreground" $FORE
- setColor_helper $w.fore "-background" $BACK
- setColor_helper $w.fore "-foreground" $FORE
- setColor_helper $w.default "-background" $BACK
- setColor_helper $w.default "-foreground" $FORE
-
- pack $w.back $w.fore -side top -anchor c -pady 2m
- pack $w.default -side top -anchor c -pady 5m
- }
-
-
- # handles the changes of the colors user chose and applies them
- proc setColor {w button name options} {
- global BACK FORE
-
- grab $w
- set initialColor [$button cget -$name]
-
- set color [tk_chooseColor -title "Choose a $name color" -parent $w \
- -initialcolor $initialColor]
-
- if {![string compare $name "background"]} {
- if {[string compare $color ""]} {
- set BACK $color
- }
- }
- if {![string compare $name "foreground"]} {
- if {[string compare $color ""]} {
- set FORE $color
- }
- }
-
- if [string compare $color ""] {
- setColor_helper $w $options $color
- }
- grab release $w
- }
-
-
- # handles the changes of the colors user chose and applies them
- proc setColor_helper {w options color} {
- foreach option $options {
- catch {
- $w config $option $color
- }
- }
- foreach child [winfo children $w] {
- setColor_helper $child $options $color
- }
- }
-
-
-
- # brings up a help window
- # Note: UNIMPLEMENTED
- proc do_help { item } {
- global JETHOME
-
- catch { exec $JETHOME/bin/help.tcl $item }
- }
-
-
- # read data saved in files concerning hotsync options
- proc init_hsa_conduits {} {
- global JETHOME CONDUIT_FILE hsa_conduits USER
-
- if {[string compare $USER "NULL"]} {
- set fp [open $JETHOME/$USER/conf/$CONDUIT_FILE r]
- } else {
- set fp [open $JETHOME/default/$CONDUIT_FILE r]
- }
- while {[gets $fp line] >= 0 } {
- lappend hsa_conduits [lindex [split $line ":"] 0]
- }
- close $fp
- }
-
-
- # retrieves a list of currently installed users
- proc getusers {} {
- global JETHOME JETUSERS_FILE
-
- set fp [open $JETHOME/conf/$JETUSERS_FILE r]
- set getusers_ret ""
- while {[gets $fp line] >= 0 } {
- lappend getusers_ret [lindex [split $line ":"] 0]
- }
- close $fp
- return $getusers_ret
- }
-
- ### Generic procedures ###
-
- # handle close button in HotSync action dialog
- proc closehsa { } {
- global hotsync_opt curhsaopt
- destroy .changehsa
-
- setHotSyncPrefs $hotsync_opt $curhsaopt 1
- }
-
-
- # brings up HotSync action dialog
- proc dochangehotsync {} {
- global curhsaopt hotsync_opt
-
- if { ! [string compare $hotsync_opt "(undefined)"]} { return }
-
- set curhsaopt [getHotSyncPrefs $hotsync_opt]
-
- catch {destroy .changehsa}
- toplevel .changehsa
- wm title .changehsa "Change HotSync Action"
- wm geometry .changehsa +337+201
- frame .changehsa.top
- frame .changehsa.left
- frame .changehsa.leftest
- frame .changehsa.right
-
- genericbgcolor .changehsa
- genericbgcolor .changehsa.top
- genericbgcolor .changehsa.left
- genericbgcolor .changehsa.leftest
- genericbgcolor .changehsa.right
-
- label .changehsa.top.l1 -text "HotSync action for $hotsync_opt" -anchor w
- setupcolor .changehsa.top.l1 0
- pack .changehsa.top.l1 -side left -fill x -expand 1
-
- radiobutton .changehsa.left.r1 -width 40 -text "Synchronize the files" -variable curhsaopt -value 1 -anchor w
- radiobutton .changehsa.left.r2 -text "Desktop to PalmPilot" -variable curhsaopt -value 2 -anchor w
- radiobutton .changehsa.left.r3 -text "PalmPilot to desktop" -variable curhsaopt -value 3 -anchor w
- radiobutton .changehsa.left.r4 -text "Do nothing" -variable curhsaopt -value 4 -anchor w
-
- if { $hotsync_opt == "Install" } {
- .changehsa.left.r1 configure -state disabled
- .changehsa.left.r3 configure -state disabled
- }
-
- setupcolor .changehsa.left.r1 1
- setupcolor .changehsa.left.r2 1
- setupcolor .changehsa.left.r3 1
- setupcolor .changehsa.left.r4 1
-
- label .changehsa.leftest.l1 -image imagehotsync -bd 0
- pack .changehsa.leftest.l1
-
- pack .changehsa.left.r1 .changehsa.left.r2 .changehsa.left.r3 .changehsa.left.r4 -expand 1 -fill x -pady 10
-
- pack .changehsa.top -side top -fill x -expand 1
- pack .changehsa.leftest .changehsa.left .changehsa.right -side left
-
- defbutton .changehsa.right.ok -text "Ok" -command "closehsa"
- cancelbutton .changehsa.right.cancel -text "Cancel" -command "destroy .changehsa"
- button .changehsa.right.help -text "Help" -command "do_help 1"
-
- setupcolor .changehsa.right.ok 1
- setupcolor .changehsa.right.cancel 1
- setupcolor .changehsa.right.help 1
-
- pack .changehsa.right.ok .changehsa.right.cancel .changehsa.right.help -padx 10 -fill x -pady 10
- }
-
-
- # reads all hotsync options and preferences
- proc read_defaults {} {
- global hsa_conduits USER
-
- set hsa_conduits ""
- init_hsa_conduits
- initHotSyncPrefs $USER
- }
-
-
- # brings up the HotSync dialogs according to 'param'
- proc setup { param } {
- global hsa_conduits hotsync_opt USER
- global local_dev_port local_dev_speed
- global modem_dev_type modem_dev_str modem_dev_port modem_dev_speed
- global daemon_flag
-
- catch {destroy .setup}
- toplevel .setup
- wm geometry .setup +306+128
-
- frame .setup.bottom
- genericbgcolor .setup
- genericbgcolor .setup.bottom
-
- set hotsync_opt "(undefined)"
-
- case $param {
- HotSync {
- wm title .setup "HotSync - Setup"
- frame .setup.up
- frame .setup.left
- frame .setup.right
-
- pack .setup.up -fill x
- pack .setup.left -side left -pady 10
- pack .setup.right -side left -padx 10 -pady 10
-
- genericbgcolor .setup.left
- genericbgcolor .setup.right
- genericbgcolor .setup.up
-
- label .setup.up.label -text "Current user:"
- menubutton .setup.up.list -text "$USER" -indicatoron 1 \
- -direction below -menu .setup.up.list.m -relief raised -width 20
- setupcolor .setup.up.list 1
-
- menu .setup.up.list.m -tearoff 0
- setupcolor .setup.up.list.m 1
- foreach item [getusers] {
- .setup.up.list.m add command -label $item \
- -command "changeUser \"$item\" 1 ; \
- .setup.right.b2 configure -state disabled"
- }
- pack .setup.up.label .setup.up.list -side left -pady 10
-
- listbox .setup.left.list -width 60
- .setup.left.list configure -font *-times-*-r-*--*-140-*-*-*-*-*-*
-
- setupcolor .setup.left.list 0
-
- pack .setup.left.list
- foreach item $hsa_conduits {.setup.left.list insert end $item}
- bind .setup.left.list <ButtonRelease-1> {
- set hotsync_opt [selection get]
- .setup.right.b2 configure -state normal
- }
- bind .setup.left.list <Double-Button-1> {
- set hotsync_opt [selection get]
- dochangehotsync
- }
-
- button .setup.right.b1 -text "Done" -command {destroy .setup
- source $JETHOME/$USER/conf/color.def
- update
- tk_setPalette \
- foreground $FORE background $BACK \
- activeforeground $FORE activebackground $BACK
- }
- button .setup.right.b2 -text "Change..." -command "dochangehotsync"
-
- .setup.right.b2 configure -state disabled
- button .setup.right.b3 -text "Help" -command "do_help 2"
-
- setupcolor .setup.right.b1 1
- setupcolor .setup.right.b2 1
- setupcolor .setup.right.b3 1
-
- pack .setup.right.b1 .setup.right.b2 .setup.right.b3 -fill x -pady 5
-
- return
- }
- General {
- wm title .setup "HotSync - Manager setup"
- frame .setup.f0
- frame .setup.f1
-
- genericbgcolor .setup.f0
- genericbgcolor .setup.f1
-
- label .setup.f0.l1 -text "HotSync Manager..."
- setupcolor .setup.f0.l1 0
-
- radiobutton .setup.f1.l1 -variable daemon_flag -value 0 \
- -text "Always available" -anchor w
- radiobutton .setup.f1.l2 -variable daemon_flag -value 1 \
- -text "Only when JetSync is running" -anchor w
- radiobutton .setup.f1.l3 -variable daemon_flag -value 2 \
- -text "Manual" -anchor w
-
- setupcolor .setup.f1.l1 1
- setupcolor .setup.f1.l2 1
- setupcolor .setup.f1.l3 1
-
- pack .setup.f0 .setup.f1 -anchor w -pady 5
- pack .setup.f0.l1 -fill x
- pack .setup.f1.l1 .setup.f1.l2 .setup.f1.l3 -fill x
- }
- Local {
- wm title .setup "HotSync - Local setup"
- frame .setup.up
- frame .setup.dn
-
- genericbgcolor .setup.up
- genericbgcolor .setup.dn
-
- label .setup.up.l1 -text "Serial Port"
-
- entry .setup.up.e1 -textvariable local_dev_port
- label .setup.dn.l2 -text "Speed"
- entry .setup.dn.e2 -textvariable local_dev_speed
-
- setupcolor .setup.up.l1 0
- setupcolor .setup.up.e1 0
- setupcolor .setup.dn.l2 0
- setupcolor .setup.dn.e2 0
-
- pack .setup.up .setup.dn -side top
- pack .setup.up.l1 .setup.up.e1 -side left -fill x
- pack .setup.dn.l2 .setup.dn.e2 -side left -fill x
- }
- Modem {
- wm title .setup "HotSync - Modem setup"
- frame .setup.f1
- frame .setup.f2
- frame .setup.f3
- frame .setup.f4
-
- genericbgcolor .setup.f1
- genericbgcolor .setup.f2
- genericbgcolor .setup.f3
- genericbgcolor .setup.f4
-
- label .setup.f1.l1 -text "Serial Port"
- entry .setup.f1.e1 -textvariable modem_dev_port
- label .setup.f2.l2 -text "Speed"
- entry .setup.f2.e2 -textvariable modem_dev_speed
- label .setup.f3.l3 -text "Modem"
- entry .setup.f3.e3 -textvariable modem_dev_type
- label .setup.f4.l4 -text "Setup String"
- entry .setup.f4.e4 -textvariable modem_dev_str
-
- setupcolor .setup.f1.l1 0
- setupcolor .setup.f1.e1 0
- setupcolor .setup.f2.l2 0
- setupcolor .setup.f2.e2 0
- setupcolor .setup.f3.l3 0
- setupcolor .setup.f3.e3 0
- setupcolor .setup.f4.l4 0
- setupcolor .setup.f4.e4 0
-
- pack .setup.f1 .setup.f2 .setup.f3 .setup.f4
- pack .setup.f1.l1 .setup.f1.e1 -side left -fill x
- pack .setup.f2.l2 .setup.f2.e2 -side left -fill x
- pack .setup.f3.l3 .setup.f3.e3 -side left -fill x
- pack .setup.f4.l4 .setup.f4.e4 -side left -fill x
- }
- }
-
- pack .setup.bottom -side top
- defbutton .setup.bottom.ok -text "Ok" -command "save_devices; destroy .setup"
- cancelbutton .setup.bottom.cancel -text "Cancel" -command "load_devices; destroy .setup"
- button .setup.bottom.help -text "Help" -command "do_help 3"
-
- if {![string compare $param "General"]} {
- .setup.bottom.help configure -command "do_help 4"
- }
-
- setupcolor .setup.bottom.ok 1
- setupcolor .setup.bottom.cancel 1
- setupcolor .setup.bottom.help 1
-
- pack .setup.bottom.ok .setup.bottom.cancel .setup.bottom.help -side left -pady 10
- }
-
-
- # runs the built-in application defined by 'appname'
- proc dotask {appname button} {
- global USER JETHOME
- update
-
- $button configure -relief sunken
- update
-
- if {[string compare $appname "ical"]} {
- catch { exec $appname "$USER" -geometry +100+100 } var
- } else {
- # read iCal data file location
- set fp [open $JETHOME/$USER/conf/jetdate.dat r]
- gets $fp DATADIR
- close $fp
-
- catch { exec $appname -calendar $DATADIR/i.cal -geometry +100+100 } var
- }
-
- $button configure -relief raised
- }
-
-
- ### INIT stuff ###
-
- update_splash Initializing
-
- load_devices
- source $JETHOME/conf/button.def
-
- read_defaults
- setHotSyncPrefs NULL 0 0
-
- frame .mbar -relief raised -bd 2
- frame .bot
- frame .bot.f1
- frame .bot.f2
- frame .status -width 100
-
-
- genericbgcolor .mbar
- genericbgcolor .bot
- genericbgcolor .bot.f1
- genericbgcolor .bot.f2
- genericbgcolor .status
-
- update_splash "Loading widgets"
-
- image create photo palmcopy -file [file join $IMAGEDIR ping.gif]
- image create photo imagetodo -file [file join $IMAGEDIR todo.gif]
- image create photo imagememo -file [file join $IMAGEDIR memo.gif]
- image create photo imageaddr -file [file join $IMAGEDIR addr.gif]
- image create photo imagedate -file [file join $IMAGEDIR date.gif]
- image create photo imagehotsync -file [file join $IMAGEDIR hotsync.gif]
-
- label .b0 -image palmcopy -anchor w -bd 0
- button .b1 -image imagetodo -command "dotask $JETHOME/bin/jettodo .b1" -anchor w
- button .b2 -image imagememo -command "dotask $JETHOME/bin/jetmemo .b2" -anchor w
- button .b3 -image imageaddr -command "dotask $JETHOME/bin/jetaddr .b3" -anchor w
- button .b4 -image imagedate -command "dotask ical .b4" -anchor w
- button .b5 -text "Synchronize" -command "doHotSyncManager"
- if { $daemon_flag != 2 } {
- .b5 configure -state disabled
- } else {
- bind .b5 <Enter> {
- .status.l config -text "Perform synchronization"
- }
- bind .b5 <Leave> {
- .status.l config -text ""
- }
- }
-
- button .b6 -text "Quit" -command "quit"
- bind .b6 <Enter> {
- .status.l config -text "Exit JetSync"
- }
- bind .b6 <Leave> {
- .status.l config -text ""
- }
-
- label .status.l -text "" -anchor w
- setupcolor .status.l 0
- pack .status.l -anchor w
-
- bind .b1 <Enter> {
- .status.l config -text "JetTodo"
- }
- bind .b2 <Enter> {
- .status.l config -text "JetMemo"
- }
- bind .b3 <Enter> {
- .status.l config -text "JetAddr"
- }
- bind .b4 <Enter> {
- .status.l config -text "iCal"
- }
- bind .b1 <Leave> {
- .status.l config -text ""
- }
- bind .b2 <Leave> {
- .status.l config -text ""
- }
- bind .b3 <Leave> {
- .status.l config -text ""
- }
- bind .b4 <Leave> {
- .status.l config -text ""
- }
-
- setupcolor .b1 1
- setupcolor .b2 1
- setupcolor .b3 1
- setupcolor .b4 1
- setupcolor .b5 1
- setupcolor .b6 1
-
- update_splash "Setting up menus"
-
- menubutton .mbar.setup -text HotSync -menu .mbar.setup.menu
- menu .mbar.setup.menu -tearoff 0
- .mbar.setup.menu add command -label "Manager setup..." -command "setup General"
- .mbar.setup.menu add command -label "Local setup..." -command "setup Local"
- .mbar.setup.menu add command -label "Modem setup..." -command "setup Modem"
- .mbar.setup.menu add separator
- .mbar.setup.menu add command -label "Setup..." -command "setup HotSync"
- .mbar.setup.menu add separator
- .mbar.setup.menu add command -label "View log..." -command "viewLog"
-
- bind .mbar.setup <Enter> {
- .status.l config -text "HotSync configuration"
- }
- bind .mbar.setup <Leave> {
- .status.l config -text ""
- }
-
-
- menubutton .mbar.config -text Configure -menu .mbar.config.menu
- menu .mbar.config.menu -tearoff 0
- .mbar.config.menu add command -label "Add user..." -command "addUser"
- .mbar.config.menu add command -label "Remove user..." -command "delUser"
- .mbar.config.menu add command -label "Change password..." \
- -command "config_password"
- .mbar.config.menu add separator
- .mbar.config.menu add command -label "Configure JetSync colors" \
- -command "config_js_colors"
-
- bind .mbar.config <Enter> {
- .status.l config -text "User configuration"
- }
- bind .mbar.config <Leave> {
- .status.l config -text ""
- }
-
- menubutton .mbar.tools -text Conduits -menu .mbar.tools.menu
- menu .mbar.tools.menu -tearoff 0
- .mbar.tools.menu add command -label "Install conduit..." \
- -command "installConduit"
- .mbar.tools.menu add command -label "Remove conduit..." \
- -command "removeConduit"
-
- bind .mbar.tools <Enter> {
- .status.l config -text "Select which conduits you wish to use"
- }
- bind .mbar.tools <Leave> {
- .status.l config -text ""
- }
-
- setupcolor .mbar.setup 1
- setupcolor .mbar.config 1
- setupcolor .mbar.tools 1
-
- setupcolor .mbar.setup.menu 1
- setupcolor .mbar.config.menu 1
- setupcolor .mbar.tools.menu 1
-
-
- ### End splash screen ###
- destroy .stop .sbottom .sbottom2
-
-
- ### Pack main window ###
- pack .mbar -side top -fill x
- pack .mbar.setup .mbar.config .mbar.tools \
- -in .mbar -side left
-
-
- pack .bot
- pack .bot.f1 .bot.f2 -side left
-
- genericbgcolor .status
- pack .status -fill x -expand 1 -anchor s
-
- pack .b0 -in .bot.f1 -padx 20 -side left -pady 10m
- pack .b1 .b2 .b3 .b4 -in .bot.f1 -side left
- pack .b5 .b6 -in .bot.f2 -padx 20 -pady 5 -fill both -expand 1
-
- bind . <Destroy> quit
-
- center_window . 477 172
-